<?php
/**
 * Copyright (c) 2010, Slawomir Mazur <mazursllawek@gmail.com>
 * 
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions 
 * are met:
 * 
 * o Redistributions of source code must retain the above copyright notice, 
 *   this list of conditions and the following disclaimer.
 * o Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 * o Neither the name of the Softisland nor the names of its contributors
 *   may be used to endorse or promote products derived from this software
 *   without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
/**
 * Enter description here...
 *
 * @package     Library
 * @copyright   Slawomir Mazur (c) 2010 (http://www.zend.com/zce.php?c=ZEND011643)
 * @license     http://www.opensource.org/licenses/bsd-license.php
 * @author      Slawomir Mazur <mazursllawek@gmail.com>
 */

class Gp_Form extends Zend_Form
{
	protected $_addDefaultDecaorators = true;
	
	protected $_resetElements = array();
	
	protected $_buttons = array();
	
	protected function _setDefaultDecorators()
	{
		if (!$this->_addDefaultDecaorators) {
			return false;
		}
		
		$this->addDecorator('HtmlTag', array('tag' => 'ul', 'class' => 'form-list'));
					
		$this->setElementDecorators(array(
	        	'ViewHelper',
				array(array('input' => 'HtmlTag'), array('tag' => 'span', 'class' => 'col2')),
			    array(array('label' => 'Label'), array('class' => 'col1', 'escape' => false, 'requiredSuffix' => '<em>*</em>')),
			    array(array('row' => 'HtmlTag'), array('tag' => 'li', 'class' => 'row clear'))
			)
		);
		
		/* @var $element Zend_Form_Element */
		foreach ($this->getElements() as $element) {
			if ((boolean) $element->getAttrib('hiddenElement')) {
				$tagClass = $element->getDecorator('row')->getOption('class');
				$element->getDecorator('row')->setOption('class', 'hidden-row ' . $tagClass);
			}
		}
		
		// group buttons
		$this->addDisplayGroup($this->_buttons, 'action-buttons');
        $this->getDisplayGroup('action-buttons')
        	->setDecorators(array(
        			'FormElements',
                    array(array('Fieldset' => 'HtmlTag'), array('tag' => 'div', 'class' => 'action-buttons')),
					array('HtmlTag', array('tag' => 'li', 'class' => 'row clear'))
        ));
		
		// clear buttons from decoarators
		if (!empty($this->_buttons)) {
			foreach ($this->_buttons as $button) {
				$element = $this->getElement($button);
				
				if ((boolean) $element->getAttrib('hiddenElement')) {
					$element->setAttrib('class', 'no-display');
				}
				
				$element->setDecorators(array('ViewHelper'))
						->setAttrib('class', 'button' . ' ' . $element->getAttrib('class'))
						->setAttrib('escape', false)
        				->setLabel('<span><span>' . $button . '</span></span>');
			}
		}
		
		return $this;
	}
	
	protected function _addFileDecorator()
	{
		if (!empty($this->_resetElements)) {
			foreach ((array) $this->_resetElements as $elementId) {
				$this->getElement($elementId)->clearDecorators();
				
				$this->getElement($elementId)->setDecorators(array(  
				    'File',  
					array(array('input' => 'HtmlTag'), array('tag' => 'span', 'class' => 'col2')),
				    array(array('label' => 'Label'), array('class' => 'col1', 'escape' => false, 'requiredSuffix' => '<em>*</em>')),
					array(array('row' => 'HtmlTag'), array('tag' => 'li', 'class' => 'row clear'))
				));
			}
		}
		
		return $this;
	}
	
	public function setButtonsToReset(array $elements = array(), $overide = true)
	{
		if ($overide) {
			$this->_buttons = $elements;
		} else {
			$this->_buttons += $elements;
		}
		
		return $this;
	}
	
	public function setElementsToReset(array $elements = array(), $overide = true)
	{
		if ($overide) {
			$this->_resetElements = $elements;
		} else {
			$this->_resetElements += $elements;
		}
		
		return $this;
	}
	
	public function addElementsToReset(array $elements = array())
	{
		foreach ($elements as $element) {
			$this->addElementToReset($element);
		}
		
		return $this;
	}
	
	public function addElementToReset($element)
	{
		$this->_resetElements[] = $element;
		
		return $this;
	}
	
	public function render(Zend_View_Interface $view = null)
	{
		$this->_setDefaultDecorators();
		$this->_addFileDecorator();
		
		return parent::render($view);
	}
}